{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3D Transforms\n",
    "\n",
    "In this example we demonstrate 3D WarpAffine and Rotate.\n",
    "\n",
    "## Warp operators\n",
    "All warp operators work by caclulating the output pixels by sampling the source image at transformed coordinates:\n",
    "\n",
    "$${Out}(x, y, z) = {In}(x_{src}, y_{src}, z_{src})$$\n",
    "\n",
    "This way each output pixel is calculated exactly once.\n",
    "\n",
    "If the source coordinates do not point exactly to pixel centers, the values of neighboring pixels will be interpolated or the nearest pixel is taken, depending on the interpolation method specified in the `interp_type` argument.\n",
    "\n",
    "### Affine transform\n",
    "\n",
    "The source sample coordinates $x_{src}, y_{src}, z_{src}$ are calculated according to the formula:\n",
    "\n",
    "$$\n",
    "\\begin{vmatrix}\n",
    "x_{src} \\\\\n",
    "y_{src} \\\\\n",
    "z_{src}\n",
    "\\end{vmatrix}\n",
    "= \\begin{vmatrix}\n",
    "m_{00} & m_{01} & m_{02} & t_x \\\\\n",
    "m_{10} & m_{11} & m_{12} & t_y \\\\\n",
    "m_{20} & m_{21} & m_{22} & t_z\n",
    "\\end{vmatrix}\n",
    "\\begin{vmatrix}\n",
    "{x} \\\\\n",
    "{y} \\\\\n",
    "{z} \\\\\n",
    "1\n",
    "\\end{vmatrix}\n",
    "$$\n",
    "\n",
    "Where $x, y$ are coordinates of the destination pixel and the matrix represents the inverse (destination to source) affine transform. The \n",
    "$\\begin{vmatrix}\n",
    "m_{00} & m_{01} & m_{02} \\\\\n",
    "m_{10} & m_{11} & m_{12} \\\\\n",
    "m_{20} & m_{21} & m_{22}\n",
    "\\end{vmatrix}$ block represents a combined rotate/scale/shear transform and $t_x, t_y, t_z$ is a translation vector.\n",
    "\n",
    "### 3D Rotation\n",
    "\n",
    "Rotate operator is implemented in terms of affine transform, but calculates the transform matrix internally. The output size is automatically adjusted and the size parity is adjusted to reduce blur near the volume centre. The rotation is defined by specifying axis (as a vector) and angle (in degrees).\n",
    "\n",
    "The rotation matrix (source-to-destination) is calculated as:\n",
    "\n",
    "$$\n",
    "\\begin{vmatrix}\n",
    "u^2 + (v^2 + w^2) \\cdot \\cos \\alpha &\n",
    "uv\\cdot(1-\\cos \\alpha) - w\\cdot \\sin \\alpha &\n",
    "uw\\cdot(1-\\cos \\alpha) + v\\cdot \\sin \\alpha \\\\\n",
    "uv\\cdot(1-\\cos \\alpha) - w\\cdot \\sin \\alpha &\n",
    "v^2 + (u^2 + w^2) \\cdot \\cos \\alpha &\n",
    "vw\\cdot(1-\\cos \\alpha) - u\\cdot \\sin \\alpha \\\\\n",
    "uw\\cdot(1-\\cos \\alpha) - v\\cdot \\sin \\alpha &\n",
    "vw\\cdot(1-\\cos \\alpha + u\\cdot \\sin \\alpha &\n",
    "w^2 + (u^2 + w^2) \\cdot \\cos \\alpha\n",
    "\\end{vmatrix}\n",
    "$$\n",
    "\n",
    "where $u, v, w$ is normalized `axis` vector and $\\alpha$ is `angle` converted from degrees to radians.\n",
    "\n",
    "Note that internally, the inverse matrix is used to achieve destination-to-source mapping, which is how the operation is actually implemented."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Usage example\n",
    "\n",
    "First, let's import the necessary modules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import division\n",
    "from nvidia.dali.pipeline import Pipeline\n",
    "import nvidia.dali.ops as ops\n",
    "import nvidia.dali.types as types\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import os.path"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's define some volumetric test data. To make the data easy to interpret visually, the volume is mostly empty, with only the voxels lying at a cube's edges set to a color changing along Z axis from green to violet."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "nvidia_green = [0x76,0xb9,0x00]\n",
    "violet = [0xff - 0x76, 0xff - 0xb9, 0xff]\n",
    "\n",
    "def lerp(a, b, w):\n",
    "    return a*(1-w)+b*w\n",
    "\n",
    "def build_cube(output_shape, size, color_front = nvidia_green, color_back = violet):\n",
    "    color_front = np.array(color_front)\n",
    "    color_back = np.array(color_back)\n",
    "    arr = np.zeros(output_shape + [3], np.uint8)\n",
    "    lo = (np.array(output_shape) - np.array(size)) * 0.5\n",
    "    hi = (np.array(output_shape) + np.array(size)) * 0.5\n",
    "    dims = len(output_shape)\n",
    "    for d in range(dims):\n",
    "        for c in range(int(np.rint(lo[d])), int(np.rint(hi[d]))):\n",
    "            d0 = 0\n",
    "            d1 = 1\n",
    "            if d == 0:\n",
    "                d0 = 1\n",
    "                d1 = 2\n",
    "            elif d == 1:\n",
    "                d0 = 0\n",
    "                d1 = 2\n",
    "            p = [int(x) for x in lo]\n",
    "            def color():\n",
    "                return lerp(color_front, color_back, (p[0]-lo[0])/(hi[0]-lo[0]))\n",
    "\n",
    "            p[d] = c\n",
    "            arr[p[0], p[1], p[2], :] = color()\n",
    "            p[d0] = int(np.rint(hi[d0]))\n",
    "            arr[p[0], p[1], p[2], :] = color()\n",
    "            p[d1] = int(np.rint(hi[d1]))\n",
    "            arr[p[0], p[1], p[2], :] = color()\n",
    "            p[d0] = int(np.rint(lo[d0]))\n",
    "            arr[p[0], p[1], p[2], :] = color()\n",
    "    return arr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, let's define the pipeline. The transform parameters are hard-coded, but axis, angle and matrix arguments can be specified as CPU tensors. The warp matrices can alternatively be passed as a regular input to the WarpAffine operator, in which case they can be passed as a GPU tensor.\n",
    "See Warp example for exact usage."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ExamplePipeline(Pipeline):\n",
    "    def __init__(self, batch_size, num_threads, device_id, pipelined = True, exec_async = True):\n",
    "        super(ExamplePipeline, self).__init__(\n",
    "            batch_size, num_threads, device_id,\n",
    "            seed = 12, exec_pipelined=pipelined, exec_async=exec_async)\n",
    "        \n",
    "        self.input = ops.ExternalSource()\n",
    "       \n",
    "        self.rotate_gpu = ops.Rotate(\n",
    "            device = \"gpu\",\n",
    "            axis = (0.5,1,1),\n",
    "            angle = 30,\n",
    "            interp_type = types.INTERP_LINEAR\n",
    "        )\n",
    "        self.rotate_cpu = ops.Rotate(\n",
    "            device = \"cpu\",\n",
    "            axis = (0.5,1,1),\n",
    "            angle = 30,\n",
    "            interp_type = types.INTERP_LINEAR\n",
    "        )\n",
    "        self.warp_gpu = ops.WarpAffine(\n",
    "            device = \"gpu\",\n",
    "            size = (256, 256, 400),\n",
    "            matrix = (\n",
    "                1, 1, 0,   -200,\n",
    "                0, 1, 0.2, -20,\n",
    "                0, 0, 1,   10\n",
    "            ),\n",
    "            interp_type = types.INTERP_LINEAR\n",
    "        )\n",
    "        \n",
    "    # Then, we can tie the operators together to form a graph\n",
    "        \n",
    "    def define_graph(self):\n",
    "        self.data = self.input()\n",
    "        outputs = [self.data.gpu()]\n",
    "        # pass the transform parameters through GPU memory\n",
    "        outputs += [self.rotate_gpu(self.data.gpu()),\n",
    "                    self.rotate_cpu(self.data).gpu(),\n",
    "                    self.warp_gpu(self.data.gpu())]\n",
    "\n",
    "        return outputs\n",
    "    \n",
    "    # Since we're using ExternalSource, we need to feed the externally provided data to the pipeline\n",
    "    \n",
    "    def iter_setup(self):\n",
    "        # Generate the transforms for the batch and feed them to the ExternalSource\n",
    "        self.feed_input(self.data, [build_cube([128,128,128],[80,80,80]), build_cube([160,160,160],[80,120,80])])    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The pipeline class is now ready to use - we need to construct and build it before we run it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "batch_size = 2\n",
    "pipe = ExamplePipeline(batch_size=batch_size, num_threads=2, device_id = 0)\n",
    "pipe.build()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can call `run` on our pipeline to obtain the first batch of preprocessed images."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "pipe_out = pipe.run()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example output\n",
    "\n",
    "Now that we've processed the first batch of images, let's see the results. The output is projected by taking maximum intensity values along projection direction.\n",
    "\n",
    "We use a perspective projection and the projected volume is displayed in left-handed coordinates, with X axis pointing right, Y axis pointing up and Z axis pointing away from the viewer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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xrimVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFUkiRJkpSNoVSSJEmSlI2hVJIkSZKUjaFU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EUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSAAAAGiOUAgAA0BihFAAAgMYIpQAAADRGKAUAAKAxQikAAACNEUoBAABojFAKAABAY4RSuEiVUqpSynVn+fonSin/6gK34aOllE9dyGsAAHBpE0phAZRSfqmU8tNv4vwfK6X84QVsT0+Sv5/kn1+oayRJVVWfSXJr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+2qoB3/mWJrMWOEKr9BcZVIqSaooJqWl894sTQM/iV4fP3XmNdeUSpIkSZLKUjLqACRJkqR5yZE/aUocKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUGZNSSZIkSVJkTEolSZIkSZExKZUkSZIkRcakVJIkSZIUmWTUAUiSpPJTLBZjUccgSaoMjpRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTIxIrFYtQxSJIkSZIqlCOlkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJioxJqSRJkiQpMialkiRJkqTImJRKkiRJkiJjUipJkiRJisz/D4W0DGSpwwk/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1152x1296 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 1  # change this value to see other images from the batch;\n",
    "       # it must be in 0..batch_size-1 range\n",
    "    \n",
    "import cv2\n",
    "    \n",
    "def centered_scale(in_size, out_size, scale):\n",
    "    tx = (in_size[1]-out_size[1]/scale)/2\n",
    "    ty = (in_size[0]-out_size[0]/scale)/2\n",
    "    return np.array([[1/scale, 0, tx],\n",
    "                     [0, 1/scale, ty]])\n",
    "\n",
    "def project_volume(volume, out_size, eye_z, fovx = 90, zstep = 0.25):\n",
    "    output = np.zeros(out_size + [volume.shape[-1]])\n",
    "    in_size = volume.shape[1:3]\n",
    "    fovx_z = math.tan(math.radians(fovx/2)) * volume.shape[2] / out_size[1]\n",
    "\n",
    "    def project_slice(volume, plane_z):\n",
    "        plane_index = int(plane_z)\n",
    "        volume_slice = volume[plane_index]\n",
    "        scale = volume_slice.shape[1] / fov_w\n",
    "        M = centered_scale(in_size, out_size, scale)\n",
    "        return cv2.warpAffine(volume_slice, M,\n",
    "                              dsize = (out_size[1], out_size[0]),\n",
    "                              flags = cv2.WARP_INVERSE_MAP+cv2.INTER_LINEAR)\n",
    "\n",
    "    for plane_z in np.arange(0, volume.shape[0], zstep):\n",
    "        z = plane_z - eye_z\n",
    "        fov_w = z * fovx_z\n",
    "        z0 = np.clip(math.floor(plane_z), 0, volume.shape[0]-1)\n",
    "        z1 = np.clip(math.ceil(plane_z), 0, volume.shape[0]-1)\n",
    "        projected_slice = project_slice(volume, z0)\n",
    "        # trilinear interpolation\n",
    "        if z1 != z0:\n",
    "            slice1 = project_slice(volume, z1)\n",
    "            q = (plane_z - np.floor(plane_z))\n",
    "            projected_slice = (projected_slice * (1-q) + slice1*q).astype(np.uint8)\n",
    "\n",
    "        np.maximum(output, projected_slice, out = output)\n",
    "\n",
    "    return output\n",
    "\n",
    "\n",
    "import matplotlib.gridspec as gridspec\n",
    "\n",
    "len_outputs = len(pipe_out)\n",
    "\n",
    "captions = [\"original\",\n",
    "            \"rotated (gpu)\", \"rotated (cpu)\", \"warp affine (gpu)\"]\n",
    "\n",
    "fig = plt.figure(figsize = (16,18))\n",
    "plt.suptitle(\"3D transforms\", fontsize=16)\n",
    "columns = 2\n",
    "rows = int(math.ceil(len_outputs / columns))\n",
    "gs = gridspec.GridSpec(rows, columns)\n",
    "\n",
    "for i in range(len_outputs):\n",
    "    plt.subplot(gs[i])\n",
    "    plt.axis(\"off\")\n",
    "    plt.title(captions[i])\n",
    "    pipe_out_cpu = pipe_out[i].as_cpu()\n",
    "    volume = pipe_out_cpu.at(n)\n",
    "    window_size = 300\n",
    "    (h, w) = volume.shape[1:3]\n",
    "    if h > w:\n",
    "        w = window_size * w // h\n",
    "        h = window_size\n",
    "    else:\n",
    "        h = window_size * h // w\n",
    "        w = window_size\n",
    "    img = project_volume(volume, [h,w], -volume.shape[2]) * (1 / 255.0)\n",
    "    \n",
    "    # Display in left-handed coordinates:\n",
    "    # X axis points right\n",
    "    # Y axis points up\n",
    "    # Z axis points away\n",
    "    plt.imshow(img, origin='lower')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
